home *** CD-ROM | disk | FTP | other *** search
- /* $Id: rdlist.h 1.26 1995/04/03 19:26:16 JOHN Exp $ */
- /*$RDGNU$*/
- #ifndef __RDLIST__
- #define __RDLIST__
-
- #ifndef __MTYPES__
- #include "MTypes.h"
- #endif
-
- typedef long RDlistIndex;
- typedef void(*ForEachDataProc)(void *data,void *param);
-
- class RDList {
- public:
- enum {kUnusedIndex=0, kBlockSize=10};
- RDList() {fAllocSize=0;fData=0;fSize=0;}
- ~RDList();
- RDList* Clone();
- RDList* Clone(void *(*howTo)(void*));
- void FreeAll(void(*howTo)(void*));
- void FreeElement(void(*howTo)(void*) , long i);
- void Delete(long i); //Does not free item
- void DeleteAll(); //Does not free item
- void DeleteAllThat(Boolean (*doRemove)(void*, void*), void* staticLink); //Does not free items
- void DeleteFirstThat(Boolean (*doRemove)(void*, void*), void* staticLink); //Does not free items
- long GetEqualItemNo(void* item);
- void* First();
- void* Last();
- void InsertFirst(void* item) {InsertBefore(1, item);}
- void InsertLast(void* item) {if (fSize==fAllocSize) MakeDataLarger();fData[fSize++]=item;}
- void AtPut(long index, void* item) {fData[index-1] = item;} //Does not free old item
- long GetSize() const {return(fSize);}
- void* At(long i) const {return fData[i-1];}
- void* AtCheckedOrZero(long i) const;
- void InsertBefore(long i, void* item);
- void InsertAfter(long i, void* item);
- void CopyItems(RDList* fromList, long firstIndex, long nbItems, long insertIndex);
- void Each(void(*DoToItem)(void*, void*) , void* staticLink) const;
- void* FirstThat(unsigned char(*TestItem)(void*, void*) , void* staticLink);
- void PreAllocate(long size);
-
- // Aliasing
- void* GetFirst() const;
- void* GetLast() const;
- void EnQueue(void* item);
- void EnQueueFirst(void* item);
- void* DeQueue();
- void Remove(void* item);
- void FreeData(void(*howTo)(void*)); // same as FreeAll()
- long GetIdentityItemNo(void* item); // same as GetEqualItemNo()
- void DeleteElementsAt(long i, long nb = 1);
- void Clear() {DeleteAll();}
- protected:
- void** fData;
- long fSize;
- long fAllocSize;
- void MakeDataLarger();
- private:
- friend class RDListIterator;
- friend class RDListReverseIterator;
- };
-
- class RDListIterator {
- public:
- RDListIterator(const RDList* list) {fList=list;fIndex=1;fCurrent=fList->fData;}
- void Reset() {fIndex=1;fCurrent=fList->fData;}
- void* First() {fIndex=1;fCurrent=fList->fData;return (fList->fSize?*fCurrent:NULL);}
- void* Next() {return (++fIndex<=fList->fSize?*(++fCurrent):NULL);}
- Boolean More() {return (fIndex<=fList->fSize);}
- long GetIndex() {return fIndex;}
- protected:
- const RDList* fList;
- void** fCurrent;
- long fIndex;
- };
-
- class RDListReverseIterator {
- public:
- RDListReverseIterator(RDList* list,Boolean reversed,void* start);
- void Reset();
- void* First();
- void* Next();
- Boolean More();
- long GetIndex() {return fIndex;}
- protected:
- RDList* fList;
- void** fCurrent;
- long fIndex;
- Boolean fReversed;
- void* fStart;
- };
-
- class RDStack: private RDList {
- public:
- void Push(void* obj);
- void* Pop();
- };
-
- #endif
-